import com.google.common.collect.Lists;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * @author xhw
 */

public class _ArrayList {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        List<String> strList = new ArrayList<>();

        //添加：使用add()添加元素
        strList.add("a");
        strList.add("b");
        strList.add("c");

        //遍历操作：使用增强for循环来迭代ArrayList中的每个元素，并打印输出
        for (String s : strList) {
            System.out.println(s);
        }

        //访问操作：使用get()方法，可以根据索引访问元素
        final String s = strList.get(0);

        //删除操作：使用remove()方法来删除元素，可以通过索引或者直接指定对象删除
        System.out.println("开始删除第一个");
        strList.remove(0);
        System.out.println(strList); //

        System.out.println("准备指定删除c");
        strList.remove("c");
        System.out.println(strList);

        //修改操作：用set()方法可以修改指定位置上的元素。
        System.out.println("将剩下的b改成B");
        strList.set(0, "B");
        System.out.println(strList);

        //以下代码会抛出异常，因为索引为1的位置已经没有元素了（已经被前面的删除操作移除）
        //strList.set(1,"B");
        //System.out.println(strList);

        //泛型说明：Java 集合中的泛型必须是引用类型，不能是原始数据类型
        //使用泛型来指定集合元素的类型
        List<Integer> intList = new ArrayList<>();
        intList.add(1); //自动装箱，基本类型int转换成包装类型Integer（隐式装箱）
        intList.add(2);
        intList.add(3);

        //删除元素的歧义问题：如果传递的是int类型，那么它会被解释为索引
        //如果要删除的是Integer对象，应该通过使用Integer.valueOf来避免歧义。
        //这里会将数字2当作索引，从而删除索引为2的元素
        intList.remove(2);
        System.out.println(intList);

        //删除大写字母：为ArrayList添加了A-Z和a-z的字母
        strList = new ArrayList<>();
        for (int i = 65; i < 91; i++) {
            strList.add((char) i + "");
            strList.add((char) (i + 32) + "");
        }
        System.out.println(strList);
        System.out.println("删除大写字母");
        //正确的删除方法：使用 Iterator 或者 removeIf 表达式
        strList.removeIf(str -> str.charAt(0) < 97); // 删除所有大写字母
        System.out.println(strList);
    }
}
